﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insifo.WE;
using System.Text.RegularExpressions;
using System.Collections.Specialized;


public partial class segUsuarioEditar : ObjectPage
{
    #region CONSTANTES

    private const string RUTA_LISTA = "~/seg/segUsuarioListar.aspx";

    #endregion

    #region PROPIEDADES

    public string Clave
    {
        set { Session["Clave"] = value; }
        get { return (Session["Clave"].ToString()); }
    }

    #endregion

    #region EVENTOS

    protected void Page_Load(object sender, EventArgs e)
    {
        //Se establece esta linea para mostrar la descripcion en la caja de texto
        txtNombreBusqueda.Text = hfNombreBusqueda.Value;
        txtPersona.Text = hfIdPersona.Value;
        
        //Eventos del Master
        Master.MenuAccionEvento += new MasterPageMenuEditarClickHandler(Master_MenuButton);
        if (!IsPostBack)
        {
            Cargar();
        }

    }

    protected void Master_MenuButton(object sender, EventArgs e)
    {
        string strAccion = ((CommandEventArgs)e).CommandName;
        switch (strAccion)
        {
            case "Aceptar":
                Guardar("G");
                break;
            case "Aplicar":
                Guardar("A");
                break;
            case "Cancelar":
                Salir();
                break;
        }
    }


    #endregion

    #region METODOS

    protected void Cargar()
    {
        string strAccion = Request.QueryString["a"];   //a: N-Nuevo, e-Editar, v-Ver
        string strId = Request.QueryString["i"];  //Id
        
        //Carga Estado
        Util.loadCombo(ddlEstado, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_ESTADOREGISTRO), "Descripcion", "ParametroDetalle");

        //Cargar PECO
        DataTable dtPECO = ListarParametroDetalle(1, UsuarioSistema.IdAplicacion, Constantes.PARAMETRO_PECO);
        DataView dvPECO = dtPECO.DefaultView;
        dvPECO.Sort = "ValorNumero";
        Util.loadComboAndItem(ddlPECO, dvPECO.ToTable(), "Descripcion", "ParametroDetalle", string.Format("--{0}--", Resources.resDiccionario.Seleccione), "");

        //Cargar TipoUsuario
        DataTable dtTipoUsuario = ListarParametroDetalle(1, UsuarioSistema.IdAplicacion, Constantes.PARAMETRO_TIPOUSUARIO);
        DataView dvTipoUsuario = dtTipoUsuario.DefaultView;
        dvTipoUsuario.Sort = "ValorNumero";
        Util.loadCombo(ddlTipo, dvTipoUsuario.ToTable(), "Descripcion", "ParametroDetalle");

        //Inicializa el Buscador de Persona
        ucPersonaSel.Inicializar(string.Empty, string.Empty, string.Empty, string.Empty);

        switch (strAccion)
        {
            case "n":
                Master.SubTitulo.Text = Resources.resDiccionario.Nuevo;
                Nuevo();
                break;
            case "e":
                Master.SubTitulo.Text = Resources.resDiccionario.Editar;
                Editar(strAccion, strId);
                break;
            case "d":
                Master.SubTitulo.Text = Resources.resDiccionario.Inactivar;
                Editar(strAccion, strId);
                break;
            case "p":
                Master.SubTitulo.Text = Resources.resDiccionario.CambiarClave;
                Editar(strAccion, strId);
                break;
            case "r":
                Master.SubTitulo.Text = Resources.resDiccionario.ReiniciarClave;
                Editar(strAccion, strId);
                break;

            default:
                Master.SubTitulo.Text = Resources.resDiccionario.Unknow;
                break;
        }

        MostrarNombreUsuario();
    }

    protected void Nuevo()
    {
        hfCodigoUsuario.Value = string.Empty;
        hfNombreBusqueda.Value = string.Empty;

        hfAccion.Value = "n"; //Nuevo
        txtCodigoUsuario.Text = string.Empty;
        txtNombreBusqueda.Text = string.Empty;
        txtClave.Text = string.Empty;
        txtPersona.Text = string.Empty;
        ddlPECO.SelectedIndex = 0;
        ddlTipo.SelectedIndex = 0;
        cbxAdministrador.Checked = false;
        cbxExpiraPassword.Checked = false;

        //Datos de Auditoria
        ddlEstado.SelectedIndex = 0; //Representa el primero
        txtUsuarioCreacion.Text = string.Empty;
        txtFechaCreacion.Text = string.Empty;
        txtUsuarioModificacion.Text = string.Empty;
        txtFechaModificacion.Text = string.Empty;

        //
        trReiniciarClave.Style.Add("display", "none");
        trExpirarPassword.Style.Add("display", "none");
    }

    protected void Editar(string pstrAccion, string pstrCodigoUsuario)
    {

        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario
        {
            CodigoUsuario = pstrCodigoUsuario
        };
        be = ObtenerUsuario(be);
        txtCodigoUsuario.Enabled = false;
       
        hfCodigoUsuario.Value = pstrCodigoUsuario;
        hfAccion.Value = pstrAccion; //Editar/Eliminar
        txtCodigoUsuario.Text = be.CodigoUsuario;
        Encripta encry = new Encripta();
        txtClave.Text = string.Empty;
        this.Clave = encry.DesencriptarCadena(be.Clave);

        Util.SelectCombo(ddlTipo, be.Tipo);
        Util.SelectCombo(ddlPECO, be.PECO);

        if (ddlTipo.SelectedValue == Constantes.TIPOUSUARIO_USUARIO)
        {
            hfIdPersona.Value = be.IdPersona.ToString();
            txtPersona.Text = be.IdPersona.Equals(0)? string.Empty: be.IdPersona.ToString();
            txtNombreBusqueda.Text = be.Nombre;
            hfNombreBusqueda.Value = be.Nombre;
        }
        else if (ddlTipo.SelectedValue == Constantes.TIPOUSUARIO_PERFIL)
        {
            txtNombrePerfil.Text = be.Nombre;
            trClaveAnt.Style.Add("display", "none");
        }
        //txtClave0.TextMode = TextBoxMode.Password;
        cbxExpiraPassword.Checked = be.ExpiraPassword == "S" ? true : false;
        cbxAdministrador.Checked = be.Administrador == "S" ? true : false;

        //Datos de Auditoria
        Util.SelectCombo(ddlEstado, be.Estado);
        txtUsuarioCreacion.Text = be.UsuarioCreacion;
        txtFechaCreacion.Text = be.FechaCreacion.ToString(AppSettings.FormatoFechaHora);
        txtUsuarioModificacion.Text = be.UsuarioModificacion;
        txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);
        

        if (pstrAccion == "e")
        {
            ddlTipo.Enabled = false;
            txtClave.Visible = false;
            txtClaveEdit.Visible = true;
            txtClaveEdit.Enabled = false;
            trClave0.Style.Add("display", "none");
            trClaveAnt.Style.Add("display", "none");
            trReiniciarClave.Style.Add("display", "none");
            trExpirarPassword.Style.Add("display", "none");

            //txtClave.CausesValidation = false;
            //txtClave0.CausesValidation = false;
            rfvClave.Enabled = false;
            rfvClave0.Enabled = false;
           
        }
        if (pstrAccion == "p")
        {
           
            trReiniciarClave.Style.Add("display", "none");
            trExpirarPassword.Style.Add("display", "none");
            //trClave0.Style.Add("display", "none");
            rfvClave.Enabled = false;
            rfvClave0.Enabled = false;

            txtCodigoUsuario.Enabled = false;
            txtNombreBusqueda.Enabled = false;
            txtNombrePerfil.Enabled = false;
            ddlTipo.Enabled = false;
            ddlPECO.Enabled = false;
            cbxExpiraPassword.Enabled = false;
            cbxAdministrador.Enabled = false;
            ddlEstado.Enabled = false;
        }
        if (pstrAccion == "d")
        {
            Master.MenuAplicar.Visible = false; //Remueve el boton aplicar

            txtClave.Visible = false;
            txtClaveEdit.Visible = true;
            txtClaveEdit.Enabled = false;

            trClave0.Style.Add("display", "none");
            trClaveAnt.Style.Add("display", "none");
            //txtClave.CausesValidation = false;
            //txtClave0.CausesValidation = false;
            rfvClave.Enabled = false;
            rfvClave0.Enabled = false;

            trReiniciarClave.Style.Add("display", "none");
            trExpirarPassword.Style.Add("display", "none");

            txtCodigoUsuario.Enabled = false;
            txtNombreBusqueda.Enabled = false;
            txtNombrePerfil.Enabled = false;
            txtClave.Enabled = false;
            ddlTipo.Enabled = false;
            ddlPECO.Enabled = false;
            cbxExpiraPassword.Enabled = false;
            cbxAdministrador.Enabled = false;
            ddlEstado.Enabled = false;

            if (be.Estado == Constantes.ESTADO_ACTIVO)
            {
                Util.SelectCombo(ddlEstado, Constantes.ESTADO_INACTIVO);
            }
            else
            {
                Util.SelectCombo(ddlEstado, Constantes.ESTADO_ACTIVO);
            }
        }
        //jdelvillar.
        if(pstrAccion =="r")
        {
            trClaveAnt.Style.Add("display", "none");
            trClave0.Style.Add("display", "none");
            trClave.Style.Add("display", "none");
            rfvClave.Enabled = false;
            rfvClave0.Enabled = false;
            
            var objParametroDet = ObtenerParametroDetalle(1, 1, "CLAVEGENERICO", "1");
             txtReiniciarClave.Text = objParametroDet.ValorTexto1; 

            txtCodigoUsuario.Enabled = false;
            txtNombreBusqueda.Enabled = false;
            txtNombrePerfil.Enabled = false;
            ddlTipo.Enabled = false;
            ddlPECO.Enabled = false;
            cbxExpiraPassword.Enabled = false;
            cbxAdministrador.Enabled = false;
            ddlEstado.Enabled = false;


        }
    }

    protected bool Validar(out WCUsuario.BEUsuario pbe)
    {
        pbe = new WCUsuario.BEUsuario();
        string strCodigo = string.Empty, strNombre = string.Empty, strTipo = string.Empty;
        string strUsuario = string.Empty, strEstado = string.Empty, strIdPersona = string.Empty;
        string strAccion = string.Empty, strPECO = string.Empty, strClave = string.Empty, strClave0 = string.Empty, strClaveAnt = string.Empty;
        string strAdministrador = string.Empty, strExpiraPassword = string.Empty;

        strAccion = hfAccion.Value; //a: n-Nuevo, e-Editar, v-Ver
        strCodigo = txtCodigoUsuario.Text.Trim();
        strTipo = ddlTipo.SelectedValue;
       
        

        if (ddlTipo.SelectedValue == Constantes.TIPOUSUARIO_USUARIO)
        {
            strIdPersona = hfIdPersona.Value.Trim();
            strNombre = hfNombreBusqueda.Value.Trim();
            strClave = txtClave.Text.Trim();
            strClaveAnt = txtClaveAnt.Text.Trim();
            strClave0 = txtClave0.Text.Trim();
            strPECO = ddlPECO.SelectedValue;
            strAdministrador = cbxAdministrador.Checked ? "S" : "N";
            strExpiraPassword = cbxExpiraPassword.Checked ? "S" : "N";

            if (strAccion == "n")
            {
                if (!strClave.Equals(strClave0))
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgAlertaClaveDistinta));
                    return false;
                }
            }
            if (strAccion == "e")
            {
                strClave = this.Clave;
            }
            if (strAccion == "d")
            {
                strClave = this.Clave;
            }
            if (strAccion == "p")
            {
                Encripta en = new Encripta();
                if (!strClaveAnt.Equals(this.Clave) || strClave != strClave0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgAlertaClaveDistinta));
                    return false;
                }
                strClave = strClave0;
            }
            //jdelvillar.
            if (strAccion == "r")
            {
                if (string.IsNullOrEmpty(txtReiniciarClave.Text))
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgAlertaClaveVacio));
                    return false;
                }
                strClave = txtReiniciarClave.Text.Trim();
            }
        }
        else if (ddlTipo.SelectedValue == Constantes.TIPOUSUARIO_PERFIL)
        {
            strIdPersona = 0.ToString();
            strNombre = txtNombrePerfil.Text.Trim();
        }


        strEstado = ddlEstado.SelectedValue;
        strUsuario = UsuarioSistema.CodigoUsuario;

        //Inicializa
        Encripta enc = new Encripta();

        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario
        {
            CodigoUsuario = strCodigo,
            Nombre = strNombre,
            Clave = enc.EncriptarCadena(strClave),
            Tipo = strTipo,
            PECO = strPECO,
            IdPersona = Int32.Parse(strIdPersona),
            ExpiraPassword = strExpiraPassword,
            Administrador = strAdministrador,
            Estado = strEstado,
            UsuarioCreacion = strUsuario,
            FechaCreacion = DateTime.Now,
            UsuarioModificacion = strUsuario,
            FechaModificacion = DateTime.Now
        };
        pbe = be;
        return true;
    }

    protected void Guardar(string pstrEvento) //G:Grabar, A:Aplicar
    {
        string strAccion = string.Empty;
        string strUsuario = string.Empty;

        strAccion = hfAccion.Value; //a: n-Nuevo, e-Editar, v-Ver
        strUsuario = UsuarioSistema.CodigoUsuario;

        WCUsuario.BEUsuario be;

        if (!Validar(out be)) //Valida e Inicializa
        {
            return;
        }

        //Grabar
        switch (strAccion)
        {
            case "n": //Nuevo
                be = InsertarUsuario(be);
                if (be.Error != 0)
                {
                    //if (be.Error < 0)
                    //{
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrarUsuario));
                    //}
                }
                else
                {
                    hfAccion.Value = "e";
                }
                hfCodigoUsuario.Value = be.CodigoUsuario.ToString();
                txtUsuarioCreacion.Text = strUsuario;
                txtFechaCreacion.Text = be.FechaCreacion.ToString(AppSettings.FormatoFechaHora);
                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaCreacion.ToString(AppSettings.FormatoFechaHora);

                break;
            case "e": //Actualiza
                be = ActualizarUsuario(be);
                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrarUsuario));
                }

                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);

                break;
            case "d": //Elimina
                be = EliminaUsuario(be);
                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrarUsuario));
                }
                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);


                break;
            case "p": //Actualiza
                be = ActualizarUsuario(be);
                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorActualizarClave));
                }

                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);

                break;
            case "r": //Reiniciar Clave
                Encripta enc = new Encripta();
                be.Clave = enc.EncriptarCadena(txtReiniciarClave.Text);
                be.ReiniciarPassword = "S";
                be = ReiniciarClave(be);
                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorReiniciarClave));
                }

                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);

                break;

        }
        if (pstrEvento == "G") { if (be.Error == 0) { Salir(); } }
    }

    protected void Salir()
    {
        string strCadena = string.Format("?a=l&param1={0}", HttpUtility.UrlDecode(Request.QueryString["param1"]));
        Util.Redireciona(RUTA_LISTA, strCadena, true);
    }


    #endregion

    #region LLAMDAS A WEBSERVICES

    /// <summary>
    /// Método Lista Niveles de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCUsuario.BEUsuario InsertarUsuario(WCUsuario.BEUsuario pbe)
    {
        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<WCUsuario.BEUsuario>(
               c => c.Insertar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Obtiene Nivel de Alerta
    /// </summary>
    /// <returns>Devuelve un Objeto</returns>
    protected WCUsuario.BEUsuario ObtenerUsuario(WCUsuario.BEUsuario pbe)
    {
        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<WCUsuario.BEUsuario>(
               c => c.Obtener(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Actualiza un Nivele de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCUsuario.BEUsuario ActualizarUsuario(WCUsuario.BEUsuario pbe)
    {
        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<WCUsuario.BEUsuario>(
               c => c.Actualizar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Elimina un Nivele de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCUsuario.BEUsuario EliminaUsuario(WCUsuario.BEUsuario pbe)
    {
        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<WCUsuario.BEUsuario>(
               c => c.Eliminar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }



    /// <summary>
    /// Método Lista Usuarios
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarUsuario()
    {
        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario();
        be.Descripcion = "";
        be.Estado = "A";
        be.Pagina = 0;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.Listar(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }
    
    /// <summary>
    /// Método Actualiza reinicia la clave
    /// </summary>
    /// <returns>Devuelve</returns>
    protected WCUsuario.BEUsuario ReiniciarClave(WCUsuario.BEUsuario pbe)
    {
        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<WCUsuario.BEUsuario>(
               c => c.ReiniciarClave(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarParametroDetalle(int pintidCompania, int pintIdAplicacion, string pstrParametro)
    {
        WCParametroDetalle.BEParametroDetalle be = new WCParametroDetalle.BEParametroDetalle();
        be.IdCompania = pintidCompania;
        be.IdAplicacion = pintIdAplicacion;
        be.Parametro = pstrParametro;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCParametroDetalle.IWCParametroDetalle>("BasicHttpBinding_IWCParametroDetalle"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="pintidCompania"></param>
    /// <param name="pintIdAplicacion"></param>
    /// <param name="pstrParametro"></param>
    /// <param name="pstrParametroDetalle"></param>
    /// <returns></returns>
    protected WCParametroDetalle.BEParametroDetalle ObtenerParametroDetalle(int pintidCompania, int pintIdAplicacion, string pstrParametro, string pstrParametroDetalle)
    {
        WCParametroDetalle.BEParametroDetalle be = new WCParametroDetalle.BEParametroDetalle();
        be.IdCompania = pintidCompania;
        be.IdAplicacion = pintIdAplicacion;
        be.Parametro = pstrParametro;
        be.ParametroDetalle = pstrParametroDetalle;
        using (var client = new ServiceClient<WCParametroDetalle.IWCParametroDetalle>("BasicHttpBinding_IWCParametroDetalle"))
        {
            var response = client.ServiceOperation<WCParametroDetalle.BEParametroDetalle>(c => c.Obtener(be));
            be = response;
        }
        return be;
    }

    #endregion


    protected void ddlTipo_SelectedIndexChanged(object sender, EventArgs e)
    {
        MostrarNombreUsuario();
    }

    protected void MostrarNombreUsuario()
    {
        bool blnMostrarPersona = (ddlTipo.SelectedValue == Constantes.TIPOUSUARIO_USUARIO);
        trNombrePersona.Visible = blnMostrarPersona;
        trClave.Visible = blnMostrarPersona;
        trAdministrador.Visible = blnMostrarPersona;
        trExpirarPassword.Visible = blnMostrarPersona;
        trPECO.Visible = blnMostrarPersona;
        trNombrePerfil.Visible = !blnMostrarPersona;
        trClave0.Visible = blnMostrarPersona;
    }
}